package framework.forms;

import org.openqa.selenium.By;

import framework.BaseForm;
import framework.elements.Button;
import framework.elements.CheckBox;
import framework.elements.ComboBox;
import framework.elements.TextBox;

/** Описывает форму "заглушки логина"
 * иногда на стенде стаят заглушку для логина
 */
public class SimulatorLoginForm extends BaseForm{

	/**Базовый конструктор.
	 */
	protected SimulatorLoginForm() {
		super(By.xpath("//label[contains(.,'Новый пользователь')]"), "Симулятор логина");
	}

	private final String newTemplate = "new_";
	private final String orgTemplate = "org";
	//Поля данных о зарегестрированном пользователе
	private final TextBox regloginTxb = new TextBox(By.id("reg_login"), "Логин");
	private final ComboBox regloginCmb = new ComboBox(By.xpath("//select[@id='reg_login']"), "Логин");
	private final TextBox regpasswordTxb = new TextBox(By.id("reg_password"), "Пароль");
	//Поля данных о новом пользователе
	private final CheckBox newUserChb = new CheckBox(By.id("newUserBox"), "Новый пользователь");
	private final TextBox loginTxb = new TextBox(By.id(newTemplate + "login"), "Логин");
	private final TextBox lastNameTxb = new TextBox(By.id(newTemplate + "lastName"), "Фамилия");
	private final TextBox firstNameTxb = new TextBox(By.id(newTemplate + "firstName"), "Имя");
	private final TextBox middleNameTxb = new TextBox(By.id(newTemplate + "middleName"), "Отчество");
	private final TextBox positionTxb = new TextBox(By.id(newTemplate + "position"), "Должность");
	private final TextBox snilsTxb = new TextBox(By.id(newTemplate + "snils"), "СНИЛС");
	private final TextBox userKppTxb = new TextBox(By.id(newTemplate + "userKpp"), "КПП Пользователя");
	private final TextBox esiaIdTxb = new TextBox(By.id(newTemplate + "esiaId"), "Идентификатор ЕСИА");
	private final TextBox emailTxb = new TextBox(By.id(newTemplate + "email"), "Электронный адрес пользователя");
	private final ComboBox authorityCmb = new ComboBox(By.id(newTemplate + "authority"), "Роль");
	//Поля данных об организации
	private final TextBox fullnameTxb = new TextBox(By.id(newTemplate + orgTemplate + "FullName"), "Полное наименование организации");
	private final TextBox shortnameTxb = new TextBox(By.id(newTemplate + orgTemplate + "ShortName"), "Сокращенное наименование организации");
	private final TextBox ogrnTxb = new TextBox(By.id(newTemplate + orgTemplate + "Ogrn"), "ОГРН");
	private final TextBox innTxb = new TextBox(By.id(newTemplate + orgTemplate + "Inn"), "ИНН");
	private final TextBox kppTxb = new TextBox(By.id(newTemplate + orgTemplate + "Kpp"), "КПП");
	private final TextBox addressTxb = new TextBox(By.id(newTemplate + orgTemplate + "Address"), "Адрес организации");
	//Кнопки формы
	private final Button join = new Button(By.xpath("//input[@value='Войти']"), "Войти");

	/** Выбирает опуцию "Новый пользователь".
	 */
	public final void checkNewUser(){
		newUserChb.clickAndWait();
	}
	/** Заполняет данные о новом пользователе.
	 * @param login логин
	 * @param lastName фамилия
	 * @param firstName имя
	 * @param middleName отчество
	 * @param position должность
	 * @param snils снилс
	 * @param userKpp кпп
	 * @param esiaId идентификатор есиа
	 * @param email электронный ящик
	 * @param authority роль
	 */
	public final void fillUserData(String login, String lastName, String firstName, String middleName,
			String position, String snils, String userKpp,String esiaId, String email, String authority){
		this.loginTxb.setText(login);
		this.lastNameTxb.setText(lastName);
		this.firstNameTxb.setText(firstName);
		this.middleNameTxb.setText(middleName);
		this.positionTxb.setText(position);
		this.snilsTxb.setText(snils);
		this.userKppTxb.setText(userKpp);
		this.esiaIdTxb.setText(esiaId);
		this.emailTxb.setText(email);
		this.authorityCmb.selectByText(authority);
	}
	/** Заполняет данные об организации.
	 * @param fullname полное наименование
	 * @param shortname сокращенное наименование
	 * @param ogrn огрн
	 * @param inn инн
	 * @param kpp кпп
	 * @param address адрес
	 */
	public final void fillOrgData(String fullname, String shortname, String ogrn, String inn,
			String kpp, String address){
		this.fullnameTxb.setText(fullname);
		this.shortnameTxb.setText(shortname);
		this.ogrnTxb.setText(ogrn);
		this.innTxb.setText(inn);
		this.kppTxb.setText(kpp);
		this.addressTxb.setText(address);
	}
	/** Нажимает на кнопку "Войти"
	 */
	public final void clickJoinBtn(){
		join.jsClick();
		browser.waitForPageToLoad();
	}
	/** Производит вход в личный кабинет.
	 *  Цикл, потому что входит со второго раза - всегда.
	 * @param login логин
	 * @param password пароль
	 */
	public void login(String login, String password){
		int n = 0;
		while(n != 2){
			if (regloginCmb.isPresent()) {
				regloginCmb.selectByValue(login);
			} else {
				regloginTxb.setText(login);
				regpasswordTxb.setText(password);
			}
			clickJoinBtn();
			if(!regloginCmb.isPresent() && !regloginTxb.isPresent()){
				return;
			}
			n++;
		}
	}
	/** Вход под видом незарегистрированной организации.
	 * @param login логин
	 * @param lastName фамилия пользователя
	 * @param firstName имя
	 * @param middleName отчество
	 * @param position должность
	 * @param snils снилс
	 * @param userKpp кпп пользователя
	 * @param esiaId идентификатор есиа
	 * @param email электронная почта
	 * @param authority роль
	 * @param fullname полное наименование организации
	 * @param shortname сокращенное наименование организации
	 * @param ogrn огрн
	 * @param inn инн
	 * @param kpp кпп
	 * @param address адрес
	 */
	public void loginAsNewUser(String login, String lastName, String firstName, String middleName,
			String position, String snils, String userKpp,String esiaId, String email, String authority,
			String fullname, String shortname, String ogrn, String inn,
			String kpp, String address){
		for(int i = 0; i <= 0; i++){
			checkNewUser();
			fillUserData(login, lastName, firstName, middleName, position, snils, userKpp, esiaId, email, authority);
			fillOrgData(fullname, shortname, ogrn, inn, kpp, address);
			clickJoinBtn();
		}
	}
}
